﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using PhanMemDoVui.DataAccess;
using PhanMemDoVui.BusinessObject;
using System.Security.Cryptography;

namespace PhanMemDoVui.BusinessLogic
{
    public class UserBUS
    {
        protected Profile pr;
        protected bool state;
        protected bool type;
        private static UserBUS _instance;
#region Constructor
        protected UserBUS()
        {
            pr = null;
            state = false;
            type = false;
        }
#endregion
#region Instance
        public static UserBUS Instance()
        {
            if (_instance == null)
                _instance = new UserBUS();
            return _instance;
        }
#endregion
#region IsAdmin
        public bool IsAdmin()
        {
            return type;
        }
#endregion
#region LogOut
        public void LogOut()
        {
            state = false;
        }
#endregion
#region GetUsername
        public string GetUsername()
        {
            return pr.Username.ToString();
        }
#endregion
#region DangNhap
        public bool DangNhap(Profile profile)
        {
            ConnectData conn = new ConnectData();
            DataTable dt = new DataTable();
            if (profile == null)
                return false;
            string sql = "Select Username, Password "
                        +"From Profile "
                        +"Where Username = '" + profile.Username.ToString() + "' "
                        + " and Password = '" + MaHoaMD5(profile.Password.ToString()) + "' ";
            dt = conn.GetDataTable(sql);
            //if (dt.Rows[0][0].ToString() == "")
            if (dt.Rows.Count == 0)//neu khong tim thay ket qua thi state va type = false
            {
                state = false;
                type = false;
            }
            else
            {
                pr = profile;
                state = true;
                //Kiem tra tai khoan dang nhap co phai tai khoan Admin khong
                string checkAdmin = "Select admin_acc From System Where ID = 1";
                DataTable check = conn.GetDataTable(checkAdmin);
                DataRow[] rows = check.Select();
                if (check.Rows[0][0].ToString() == profile.Username.ToString())//if (admin_acc = profile.Username)
                    type = true;//neu la Admin thi type = true
                else type = false;//neu khong thi type = false
            }
            return state;
        }
#endregion
#region TaoTaiKhoan
        public bool TaoTaiKhoan(Profile profile)
        {
            ConnectData conn = new ConnectData();
            DataTable dt = new DataTable();
            // Kiem tra xem dang ki co dung dinh dang cho phep khong
            if (profile == null)
                return false;
            if (profile.Username.Contains(' ') || profile.Username.Length > 10 || profile.Password.Length < 6 || profile.Password.Length > 15 || profile.Password.Contains(' '))
                return false; // neu khong dung dinh dang thi tra ve false
            //neu dung dinh dang moi lam tiep
            // Lay danh sach Username trong CSDL de kiem tra        
            string check = "Select Username From Profile";
            dt = conn.GetDataTable(check);
            // Lay tai khoan admin trong System de kiem tra
            string getAdmin = "Select admin_acc From System Where ID = 1";
            DataTable ad = conn.GetDataTable(getAdmin);            
            if (dt.Rows.Count != 0)// Neu co tk da tao truoc do
            {// Kiem tra xem co ton tai Username nay hay chua
                foreach (DataRow row in dt.Rows)
                    if (profile.Username.ToUpper() == row[0].ToString().ToUpper())//khong phan biet hoa thuong bang cach ToUpper het
                        return false;//tai khoan da ton tai
                // Kiem tra xem so tai khoan co = 100 hay khong, neu < 100 thi moi cho tao
                if (dt.Rows.Count >= 100)
                    return false;
            }            
            // Kiem tra xem da co tai khoan Admin hay chua, neu chua co thi thong bao day la tk Admin
            if (ad.Rows[0][0].ToString() == "") // Neu chua co tk admin
            {
                DialogResult result = MessageBox.Show("QuizShow chưa có tài khoản quản trị, một số chức năng sẽ bị hạn chế. Bạn có thể đăng kí tài khoản này là tài khoản quản trị.\nTài khoản quản trị có một số quyền hạn đặc biệt, đăng nhập vào tài khoản quản trị để biết thêm chi tiết.\nBạn có muốn đăng kí tài khoản này là tài khoản quản trị không?", "Tạo tài khoản quản trị", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (result == DialogResult.Yes)// Neu nguoi dung chon Yes thi dang ki tk la tk quan tri
                {
                    string register = string.Format("Insert into Profile values ('{0}', '{1}', N'{2}')", profile.Username.ToString(), MaHoaMD5(profile.Password.ToString()), profile.FullName.ToString());
                    bool a = conn.ExecuteNonQuery(register);// Dang ki trong Profile truoc
                    string setAdmin = "Update System Set admin_acc = '" + profile.Username.ToString() + "' Where ID = 1";
                    bool b = conn.ExecuteNonQuery(setAdmin);// Roi moi dang ki admin trong System
                    if (a == true && b == true)//Neu dang ki thanh cong thi true
                        return true;
                    else //Neu khong thi false
                        return false;
                }
                else // Neu nguoi dung chon No thi dang ki tk la common user
                {
                    string sql1 = string.Format("Insert into Profile values ('{0}', '{1}', N'{2}')", profile.Username.ToString(), MaHoaMD5(profile.Password.ToString()), profile.FullName.ToString());
                    return conn.ExecuteNonQuery(sql1);
                }
            }
            // Neu da co tk Admin:
            string sql2 = string.Format("Insert into Profile values ('{0}', '{1}', N'{2}')", profile.Username.ToString(), MaHoaMD5(profile.Password.ToString()), profile.FullName.ToString());
            return conn.ExecuteNonQuery(sql2);
        }
#endregion
#region MaHoaMD5
        private string MaHoaMD5(string pass)
        {
            MD5CryptoServiceProvider hash = new MD5CryptoServiceProvider();
            byte[] bs = Encoding.UTF8.GetBytes(pass);
            bs = hash.ComputeHash(bs);
            StringBuilder s = new StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2"));
            }
            return s.ToString();
        }
#endregion

    }
}
